package com.fancy;

/**
 * 模拟出对象进入老年代的场景
 * @author chaigq
 * @version 1.0
 * @date 2021/5/20 8:13 上午
 */
public class VirtualColumnOldAge {

    // TODO JVM参数
    // -XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520
    // -XX:SurvivorRatio=8  -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=10485760
    // -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:virtualColumnOldAgegc.log

    // 新⽣代通过“-XX:NewSize”设置为10MB
    // “-XX:InitialHeapSize”和“-XX:MaxHeapSize”就是初始堆⼤⼩和最⼤堆⼤⼩20MB
    // -XX:SurvivorRatio=8 Eden 和 Survivor 分区比列
    // -XX:MaxTenuringThreshold=15 年轻代对象进入老年代年龄设置
    // “-XX:PretenureSizeThreshold=10485760”指定了⼤对象阈值是10MB。对象大小超过10M进入老年代
    // -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 新生代使用ParNew垃圾收集器 老年代使用CMS
    // -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 用于打印输出详细的GC收集日志的信息.
    // -Xloggc:virtualColumnOldAgegc.log 输出日指到文件

    public static void main(String[] args) {
        // 代码运⾏，就会在JVM的Eden区内放⼊⼀个2MB的对象，同时在main线程的虚拟机栈中会压⼊⼀个main()⽅
        // 法的栈帧，在main()⽅法的栈帧内部，会有⼀个“array1”变量，这个变量是指向堆内存Eden区的那个2MB的数组
        // 连续创建了3个2M的对象
        byte[] array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        array1 = null;

        byte[] array2 = new byte[128 * 1024];

        byte[] array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[2 * 1024 * 1024];
        array3 = new byte[2 * 1024 * 1024];
        array3 = null;

        byte[] array4 = new byte[2 * 1024 * 1024];
    }
}
